package com.ggh.handler;

import com.ggh.entity.RoomBeanP;
import com.ggh.entity.User;
import com.ggh.entity.UserBean;
/**

 * @author ： jj
 * @date ：2019/10/17 13:48
 * @description : 加入房间
 * @path : MatchingRoomP.java.MatchingRoomP
 * @modifiedBy ：
 */
public class MatchingRoomP {
	/**
	 * 	1：加入(or 坐下)成功
	 * 	-1：没位置，加入失败
	 * 	-2：已经在位置上，坐下失败
	 * 	-3:房卡不足
	 * @param user
	 * @param room
	 * @return
	 */
	public static boolean joinRoom(UserBean user, RoomBeanP room) {
		// 上锁
		room.getLock().lock();
		// 判断房间人数有没有满员
		if (room.getGame_userlist().size() < room.getMax_number()) {
			System.out.println("有空位，执行加入房间");
			// 用户初始化
			user.userEmpty();
			// 用户加入房间
			room.getGame_userlist().add(user);
			/*//用户上局还未结算
			if (user.getReady_state()==2){
				return false;
			}*/
			/*
			 *百人有人进入就开始
			 * 则开始游戏
			 * */
			if (room.getGame_type()<2) {
				boolean br = br(room, user);
				return br;
			}else {
				boolean sr = sr(room, user);
				if (sr){
					return sr;
				}
			}
			// 开锁
			room.getLock().unlock();
			return true;
		}
		room.getLock().unlock();// 开锁
		return false;
	}
	private static  boolean  br(RoomBeanP room,UserBean user){
		if (room.getGame_userlist().size()>2) {
			if (room.getState() == 0) {
				//进入倒计时状态
				room.setState(1);
				//添加倒计时
				room.setTime(room.getTime01());
				user.setReady_state(1);
			}
		}else {
			/*判断房间位置是否有user循环位置用户坐下*/
			for (int i = 0; i < room.getUser_positions().length; i++) {
				if (room.getUser_positions()[i] == -1) {
					room.getUser_positions()[i] = user.getUserid();
					user.setLog_lat(i);
					// 坐下,结束循环
					break;
				}
			}
		}
		// 调用坐下方法
		if (room.getState()  == 1&&room.getTime()>0) {
			// 开锁
			room.getLock().unlock();
			return getready(user, room);
		} else {
			// 不用坐下，用户为游客
			user.setBanker(0);
			if (room.getState() > 1) {
				// 用户中途加入
				user.setReady_state(4);
			} else {
				// 用户未准备
				user.setReady_state(0);
			}
			// 开锁
			room.getLock().unlock();
			return true;
		}
	}

	private static  boolean  sr(RoomBeanP room,UserBean user){
		// 调用坐下方法
		if (room.getState()  == 1&&room.getTime()>0) {
			// 开锁
			room.getLock().unlock();
			return getready(user, room);
		}
		return false;
	}
	/**
	 * @description :用户坐下，参数：用户id
	 * @param user
	 * @param room
	 * @return: int
	 * @date : 2019/10/11 17:43
	 * @author : jj
	 * @throws
	 */
	public static boolean  getready(UserBean user, RoomBeanP room) {

		// 上锁
		room.getLock().lock();
		try {
			if (room.getGame_number() == 0) {
				room.setGame_number(1);
			}
			/*判断房间位置是否有user循环位置用户坐下*/
			for (int i = 0; i < room.getUser_positions().length; i++) {
				if (room.getUser_positions()[i] == -1) {
					room.getUser_positions()[i] = user.getUserid();
					user.setLog_lat(i);
					// 坐下,结束循环
					break;
				}
			}
			// 坐下成功，修改用户游客改为--闲家
			user.setBanker(1);
			// 用户准备
			user.setReady_state(1);
			// 判断房间逐准备人数
			int zb = 0;
			for (int i = 0; i < room.getUser_positions().length; i++) {
				if (room.getUser_positions()[i] == -1) {
					continue;
				}
				UserBean u = room.getUserBean(room.getUser_positions()[i]);
				if (u.getMoney() > 0 && u.getReady_state() == 1) {
					zb++;
				}

			}
			/*四人牌九*/
			if (room.getGame_type()>2){
				if (zb==room.getGame_userlist().size()&&zb>2){
					// 有2个人准备（坐下）
					// 修改房间状态
					room.setState(1);
					// 赋值房间时间
					room.setTime(room.getTime01());
				}
			}
			// 开锁
		}catch (Exception e){
			return false;
		}finally {
			room.getLock().unlock();
		}
		// 入座，返回房间信息
		return true;
	}

	/*用户起来，参数：用户id*/
	public static int getreadyUp(UserBean user, RoomBeanP room) {
		// 上锁
		room.getLock().lock();
		int a = 0;
		// 判断用户是否存在于座位中
		for (int i = 0; i < room.getUser_positions().length; i++) {
			if (room.getUser_positions()[i] == user.getUserid()) {
				a++;
			}
		}
		// 判断房间位置是否有user
		if (0!=a ) {
			// 循环位置user起身
			for (int i = 0; i < room.getUser_positions().length; i++) {
				if (room.getUser_positions()[i] ==user.getUserid()) {
					room.getUser_positions()[i] = -1;
					//-1没有位置
					user.setLog_lat(-1);
					break;// 起来,结束循环
				}
			}
			// 起来成功，修改用户闲家改为--游客
			user.setBanker(0);
			// 用户未准备
			user.setReady_state(0);
			// 开锁
			room.getLock().unlock();
			// 入座，返回房间信息
			return 1;
		}
		// 开锁
		room.getLock().unlock();
		return -2;
	}

}
